package typecheck;

import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;


import syntaxtree.*;

public class MethodEntry  {
	ClassEntry parent; 
	String nome;
	public ClassEntry getParent() {
		return parent;
	}
	
	// hash contendo simbolos -> tipo
	// contem variaveis argumento e de escopo
	HashT simbolos;
	
	//	na duvida se o tipo de retorno pertence ao metodo ou a classe que o possui
	Type tipoDoRetorno;
	
	public MethodEntry(String nome, Type tipo) {
		this.tipoDoRetorno = tipo;
		this.parent = null;
		this.nome = nome;
		simbolos = new HashT();
		tipoDoRetorno = null;
	}

	public void addSimbolo(String s, Type t) {
		this.simbolos.insert(s, t);
	}
	public void setNome(String nome){
		this.nome = nome;
	}
	public String getNome() {
		return this.nome;
	}
	public void setPai(ClassEntry c) {
		this.parent = c;
	}
	public HashT getSimbolos() {
		return simbolos;
	}

	public Type getTipoDoRetorno() {
		return tipoDoRetorno;
	}
	
	public void setTipoDoRetorno(Type tipoDoRetorno) {
		this.tipoDoRetorno = tipoDoRetorno;
	}
	
	public Type lookupVariable(String id) {
		Type type = simbolos.lookup(id);
		ClassEntry classePai = parent;
		if (type == null) {
			type = classePai.lookupVariable(id);
		}
		return type;
	}
	
	public Type lookupMethod(String id) {
		Type methodReturn  = parent.lookupMethod(id);		
		return methodReturn;
	}
	/*
	@Override
	public void dump(IndentingWriter out) {		
		out.indent();
		out.println();
		out.println("argumentos: ");
		
		out.indent();
		for (Entry<String, Type> varEntry : argumentos) {
			out.print(varEntry.getKey());
			out.print(" :: ");
			out.print(varEntry.getValue());
			out.println();
		}
		out.outdent();
		
		out.println("locais: ");
		out.indent();
		for (Entry<String, Type> varEntry : locais) {
			out.print(varEntry.getKey());
			out.print(" :: ");
			out.print(varEntry.getValue());
			out.println();
		}
		out.outdent();
		
		out.outdent();
	}
	*/
	
}
